Materi ini diproduksi oleh tim dari Algoritma untuk Cross-Selling and Product Recommendation: Market Basket Analysis. Materi berikut hanya ditujukan untuk kalangan terbatas, meliputi individu/personal yang menerima materi ini secara langsung dari lembaga pelatihan. Materi ini dilarang untuk direproduksi, didistribusikan, diterjemahkan, atau diadaptasikan dalam bentuk apapun di luar izin dari individu dan organisasi yang berkepentingan.

Algoritma adalah pusat pendidikan Data Science di Jakarta. Kami mengadakan workshop dan program pelatihan untuk membantu para profesional dan pelajar untuk mendapatkan keahlian dalam berbagai bidang dalam ruang lingkup Data Science: data visualization, machine learning, data modeling, statistical inference, dan lain-lainnya.

Sebelum masuk ke dalam materi dan menjalankan kode-kode di dalam materi ini, silakan anda melihat bagian Library and Setup untuk melihat dan memastikan semua persyaratan dasar untuk mengikuti materi ini sudah terpenuhi termasuk package-package yang diperlukan. Pada bagian Training Objectives anda dapat melihat secara umum apa saja yang akan dipelajari dalam modul materi ini. Kami harap materi ini akan bermanfaat bagi karir ataupun menambah keahlian peserta.

1 Preface

1.1 Pendahuluan

Market Basket Analysis atau biasa disebut Association Rules merupakan salah satu metode machine learning yang bertujuan untuk mencari pola-pola interaksi antar variabel yang ada. Market basket analysis umumnya diterapkan dalam industri retail untuk mencari pola keterkaitan antar item satu dengan lainnya dalam satu transaksi yang sama. Hasil akhir dari analisis ini adalah terbentuknya aturan (rules) yang dapat digunakan sebagai dasar dari tindakan bisnis yang diambil seperti menetapkan promo pada suatu barang, merekomendasikan suatu produk yang tepat kepada pelanggan, dll. Selain itu, analisis ini pun dapat diterapkan di bidang industri lain seperti bidang kesehatan dan manufaktur.

Materi online ini bertujuan untuk memberikan pemahaman kepada peserta workshop terkait Market Basket Analysis. Adapun setelah mempelajari market basket analysis menggunakan data yang ada, peserta diharapkan dapat memahami kegunaan dan potensi market basket analysis sesuai dengan proses bisnis yang ada di profesi atau bidang industri yang dijalani oleh peserta.

1.2 Library dan Setup

Untuk dapat mengikuti materi ini, peserta diharapkan sudah menginstall beberapa packages di bawah ini. Apabila package tersebut belum terinstall, silahkan jalankan chunk atau baris kode berikut. Apabila sudah ter-install, lewati chunk berikut dan muat package yang dibutuhkan dengan menjalankan chunk selanjutnya.

1.3 Tujuan Pembelajaran

Tujuan utama dari workshop ini adalah untuk memberikan pengenalan yang komprehensif mengenai tools dan perangkat lunak yang digunakan untuk melakukan market basket analysis, yakni sebuah open-source populer: R. Adapun materi ini akan mencakup:

  • Dasar Bahasa Pemrograman R
    • R dan RStudio
    • Tipe-tipe data di R
    • Struktur data di R
  • Menyiapkan Data dengan R
    • Membaca dataset
    • Bekerja dengan data log transaksi menggunakan R : tips dan teknik
    • Bekerja dengan matrix sparse
    • Memvisualisasikan data transaksi
  • Algoritme Apriori untuk Market Basket Analysis
    • Metrik dari Market Basket Analysis
    • Algoritme Apriori
    • Mengekstraksi aturan
    • Mengevaluasi kinerja model
  • Studi Kasus
    • Market Basket Analysis menggunakan Dataset Retail
    • Menganalisis Aturan yang Dihasilkan
    • Membuat visualisasi yang interaktif pada aturan yang dihasilkan

Pada akhir workshop ini, peserta akan diminta untuk mengerjakan tugas yang kami sebut dengan Learn by Building menggunakan xxx dataset. Adapun kami telah menyiapkan templat file berformat .Rmd dengan mengosongkan beberapa bagian kode, sehingga peserta bisa mengisi bagian kode yang kosong untuk latihan. Berbekal materi yang telah peserta pelajari, di akhir sesi peserta akan membuat laporan terkait market basket analysis beserta rekomendasi bisnisnya.

2 Perkenalan Tools

Sebelum masuk ke dalam analisis data, kita perlu mengenal tools yang akan digunakan. Adapun dalam workshop ini, terdapat 2 tools yang digunakan untuk melakukan Market Basket Analysis, yaitu R dan RStudio.

R merupakan bahasa pemrograman di mana seperangkat instruksi akan diterjemahkan ke dalam bahasa komputer, sedangkan RStudio merupakan aplikasi tambahan yang dapat membantu pengguna R melakukan pekerjaannya.

2.1 Mengapa mempelajari R?

  1. Dibangun oleh ahli statistik, untuk ahli statistik.

R adalah bahasa pemrograman statistik yang dibuat oleh Ross Ihaka dan Robert Gentleman di Departemen Statistik, di University of Auckland (Selandia Baru). R dibuat untuk analisis data, dan dengan demikian, berbeda dari bahasa pemrograman tradisional. R bukan hanya bahasa pemrograman statistik, R juga environment yang lengkap untuk analis data dan perangkat lunak analisis data yang paling banyak digunakan saat ini.

  1. Memiliki banyak Library

R menyediakan banyak packages tambahan yang menambahkan fungsionalitas out-of-the-box untuk berbagai kegunaan: uji statistik, analisis deret waktu, visualisasi yang indah, dan berbagai tugas machine learning seperti algoritme regresi, algoritme klasifikasi, dan algoritme clustering. Komunitas R terkenal karena kontribusinya yang aktif dalam hal packages.

  1. Sumber Terbuka

Bagian dari alasan komunitasnya yang aktif dan berkembang pesat adalah sifat sumber terbuka (open-source) dari R. Pengguna dapat berkontribusi dalam pembuatan packages, banyak tools statistik dan template kustomisasi untuk visualisasi yang tidak ditemukan dalam aplikasi statistik lain.

  1. Digunakan oleh berbagai perusahaan perangkat lunak Terbesar di Dunia

R digunakan oleh Google untuk menghitung Return on Investment (ROI) dari berbagai iklan, dan seringkali digunakan untuk mengestimasi casual effect; seperti estimasi dampak dari sebuah fitur dari suatu aplikasi terhadap jumlah download dari aplikasi tersebut, ataupun peningkatan tingkat penjualan setelah mengeluarkan AdWords. Bahkan, Google merilis package R yang dapat digunakan oleh pengguna R lain untuk melakukan analisis serupa (lihat CausalImpact). Banyak pegawai di Google telah berkontribusi aktif terhadap komunitas pengguna R: mereka seringkali aktif dalam berbagai grup pengguna R; membuat interface untuk Google Prediction; membuat coding style versi Google untuk R, dan telah berkontribusi berbagai package untuk R.

Microsoft juga termasuk sebagai salah satu diantara perusahaan besar yang sangat bergantung pada R. Pada awalnya, Microsoft menggunakan R dalam: platform Azure–tepatnya sebagai capacity planning; sistem matchmaking pada Xbox’s TrueSkill; analisis churn untuk berbagai produk; dan beberapa internal services lain dalam Microsoft’s line of products. Langkah penting yang diambil oleh Microsoft dalam hal ini adalah akuisisi dari Revolution Analytics, yang terkenal atas berbagai produk perkembangan di R; yang sekarang lebih dikenal sebagai Microsoft R Server, Microsoft R Open, Microsoft Data Science Virtual Machine, dll.

  1. Ready for Big Data

R dapat terintegrasi dengan tools lain dalam pengolahan big data, library seperti RHadoop, ParallelR, merupakan sebagian dari library yang mampu membantu data engineers untuk melakukan komputasi pararel di R.

3 Dasar Pemrograman R

Langkah penting dalam mempelajari bahasa pemrograman R adalah mengenali cara kerja R, dan cara kerja menggunakan RStudio. Kita akan mempelajari lebih jauh cara kerja R dan fitur-fitur yang ada di dalam RStudio; dan jika ini adalah pertama kalinya Anda bekerja menggunakan bahasa pemrograman, berusahalah untuk membiasakan diri dengan tools ini, karena Anda akan seringkali menggunakan RStudio untuk berbagai kebutuhan di suatu proyek data science.

Ketika bekerja menggunakan RStudio penting bagi kita untuk mengetahui lokasi dari working directory saat ini. Fungsi pada R untuk mengetahui directory Anda saat iniadalah dengan membuat chunk lalu menjalankan fungsi getwd() seperti di bawah ini:

#> [1] "C:/Users/ysitta/Downloads/market-basket-master/market-basket-master"

3.1 Membuat Objek di R

R menyimpan data ke dalam objek R, objek tersebut disimpan dalam memori dari setiap sesi di R, berikut merupakan contoh dari pembuatan objek di R:

Kata activity di atas disebut sebagai objek yang menampung suatu nilai yaitu “Algoritma”. Jika Anda menjalan chunk di atas, maka sekarang akan muncul objek activity pada panel environment. Adapun untuk memanggil objek yang sudah dibuat Anda dapat menjalakan chunk di bawah ini

#> [1] "Algoritma"

Perlu diperhatikan bahwa R bahasa pemrograman yang case sensitive sehingga “Algoritma” berbeda dengan “algoritma”.

#> [1] FALSE

Operator == disebut dengan persamaan. Operator ini berfungsi untuk memeriksa apakah nilai pada sisi kiri sama dengan nilai pada sisi kanan. Hasil dari kode tersebut merupakan FALSE, artinya kedua data tersebut berbeda. Hal ini karena pada objek activity, elemen yang disimpan adalah “Algoritma” bukan “algoritma”.

3.2 Tipe Data di R

Pada umumnya struktur data dari objek di R adalah vector. Vector merupakan kumpulan beberapa nilai yang memiliki tipe data yang sama dan tersusun dalam satu dimensi. Terdapat 5 tipe data dasar di R yaitu :

Cara untuk mengetahui tipe data dari suatu objek, Anda dapat menggunakan fungsi class()

#> [1] "character"

Lalu, apa yang akan terjadi jika dalam satu vector memiliki beberapa tipe data yang berbeda seperti chunk dibawah ini?

#> [1] "Algoritma" "2020"      "TRUE"

Bila Anda perhatikan setiap nilai pada vector mix memiliki petik dua, artinya nilai tersebut merupakan sebuah objek dengan tipe character. Proses perubahan paksa dari suatu vector bisa disebut sebagai implicit coercion. Ilustrasi terjadinya implicit coercion dapat dilihat pada gambar di bawah ini:

Ilustrasi di atas menunjukkan hirarki dari dasar tipe data di R. Pada kasus objek mix, tipe data yang paling spesifik adalah logical (pada elemen TRUE) dan tipe data paling umum yaitu character (pada elemen “Algoritma”). Implicit coercion akan mengubah tipe data ke tipe data paling umum dari elemen-elemen yang ada. Vector mix diubah menjadi tipe character karena terdapat elemen “Algoritma” yang bertipe character.

#> [1] "character"

Knowledge Check

Tentukan tipe data dari vector-vector di bawah ini?

  • c(TRUE, 1L, 1/2)
  • c(“1”, 12, 33.3)
  • c(1,2,3,4L)

3.3 Struktur Data di R

Setelah Anda mengetahui bagaimana cara menyimpan suatu objek ke dalam struktur data vector dan bagaimana sifat dari suatu vector, di R, terdapat pula beberapa cara untuk menyimpan elemen-elemen ke dalam objek selain vector, yakni ada pula struktur data list, matrix dan data frame. Selanjutnya, akan dibahas masing-masing struktur data tersebut.

3.3.1 Matrix

Struktur data matrix merupakan salah satu cara di R untuk menyimpan data dalam bentuk objek. Matrix memiliki sifat yang sama dengan vector yaitu hanya dapat menyimpan satu tipe data saja. Adapun cara untuk membuat sebuah matrix, Anda dapat menggunakan fungsi matrix():

#>      [,1] [,2]
#> [1,]   11   14
#> [2,]   12   15
#> [3,]   13   16

Perhatikan bagaimana nilai dalam sebuah matrix terisi; matrix akan terisi secara baris terlebih dahulu karena parameter byrow yang bernilai FALSE secara default. Nilai dalam sebuah matrix akan terisi dari indeks [1, 1] dapat dibaca sebagai [row index, column index] yang merupakan nilai paling kiri atas.

3.3.2 List

Dalam vector dan matrix, kita hanya bisa menggunakan elemen-elemen dengan tipe data yang sama. Jika kita ingin menyimpan beberapa data dengan tipe data yang berbeda, kita bisa menggunakan struktur data list:

#> [[1]]
#> [1]  TRUE FALSE
#> 
#> [[2]]
#> [1] "TRUE"
#> 
#> [[3]]
#> [1]  1  6 12
#> 
#> [[4]]
#> [1] 1

Seperti yang dapat dilihat di atas, sebuah list dapat menyimpan objek dengan tipe yang berbeda, dan juga memperbolehkan masing-masing objek di dalamnya untuk memiliki panjang yang berbeda juga. Seperti vector, sebuah list hanya memiliki 1 dimensi; namun jika Anda ingin mengakses elemen-elemen data di dalamnya, Anda dapat menggunakan []. Meskipun kita sudah menggunakan [], kita masih akan mendapatkan objek dengan struktur data berupa list:

#> [1] "list"

Untuk mengakses vector yang ada di dalamnya, maka kita bisa menggunakan [[]]:

#> [1] "numeric"

3.3.3 Data Frame

Dalam pengolahan data, seringkali kita dihadapkan dengan data berbentuk tabel; seperti hasil rekapitulasi penjualan dari masing-masing toko. Umumnya, data dengan bentuk seperti ini akan memiliki 2 dimensi, yaitu baris yang menggambarkan setiap observasi dan kolom yang menggambarkan setiap variabel dari data.

Representasi data seperti penjelasan di atas, disebut dengan struktur data data.frame. Adapun cara untuk membuat sebuah data frame kita bisa menggunakan fungsi data.frame() seperti di bawah ini:

Ilustrasi dari rangkuman keempat struktur data yang sudah kita bahas di atas, dapat diilustrasikan seperti di bawah ini:

4 Data Wrangling di R

Setelah memahami dasar dari pemrograman di R seperti tipe dan struktur data, sekarang Anda akan bekerja dengan data Onlineretail.csv yang sudah tersedia pada folder data. Data ini diperoleh dari repositori data UCI. Adapun untuk membaca data tersebut di R, Anda bisa menggunakan fungsi read.csv().

Bila Anda terbiasa bekerja dengan spreadsheet Anda pasti akan melihat seluruh data yang akan diolah. Mempertimbangkan data transaksi yang memiliki dimensi yang besar akan memperlambat kinerja mesin bila kita melihat keseluruhan isi data. Oleh sebab itu, ketika bekerja dengan R Anda tidak perlu melihat seluruh data Anda, namun ada beberapa hal yang perlu Anda periksa seperti:

  1. Kolom apa saja yang ada pada data
  2. Melihat sample dari data
  3. Tipe data dari setiap kolom
  4. Rangkuman dari data

Cara untuk mengetahui struktur dari data yang akan diolah, kita bisa menggunakan fungsi str() di R.

#> 'data.frame':    541909 obs. of  8 variables:
#>  $ InvoiceNo  : chr  "536365" "536365" "536365" "536365" ...
#>  $ StockCode  : chr  "85123A" "71053" "84406B" "84029G" ...
#>  $ Description: chr  "white hanging heart t-light holder" "white metal lantern" "cream cupid hearts coat hanger" "knitted union flag hot water bottle" ...
#>  $ Quantity   : int  6 6 8 6 6 2 6 6 6 32 ...
#>  $ InvoiceDate: chr  "12/1/2010 8:26" "12/1/2010 8:26" "12/1/2010 8:26" "12/1/2010 8:26" ...
#>  $ UnitPrice  : num  2.55 3.39 2.75 3.39 3.39 7.65 4.25 1.85 1.85 1.69 ...
#>  $ CustomerID : int  17850 17850 17850 17850 17850 17850 17850 17850 17850 13047 ...
#>  $ Country    : chr  "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...

Dari output di atas, bisa diketahui bahwa terdapat 541 ribu observasi dengan 8 kolom/variabel. Berikut penjelasan untuk setiap kolom :

  • InvocieNo : Nomer invoice/faktur pembelian
  • StockCode : Kode stok barang
  • Description : Nama barang
  • Quantity : Jumlah pembelian
  • InvoiceDate : Tanggal invoice diterbitkan
  • UnitPrice : Harga satuan barang
  • CustomerID : ID pelanggan
  • Country : Negara asal pelanggan

Informasi yang terdapat setelah nama kolom, misalkan . , dan menunjukkan tipe data untuk setiap kolom, dengan ketentuan:
* <dbl> : double atau numerik
* <int> : integer atau bilangan bulat
* <chr> : character

Selain itu, untuk melihat sample data, kita bisa menggunakan fungsi head() yang bertujuan untuk menunjukkan 6 baris dari data teratas.

Sedangkan untuk melihat data baris terakhir, bisa menggunakan fungsi tail()

Tentunya, untuk mengetahui kondisi data saat ini akan sulit apabila hanya melihat dari sebagian data saja, oleh sebab itu kita akan menggunakan fungsi summary() untuk melihat rangkuman dari data.

#>   InvoiceNo          StockCode         Description           Quantity        
#>  Length:541909      Length:541909      Length:541909      Min.   :-80995.00  
#>  Class :character   Class :character   Class :character   1st Qu.:     1.00  
#>  Mode  :character   Mode  :character   Mode  :character   Median :     3.00  
#>                                                           Mean   :     9.55  
#>                                                           3rd Qu.:    10.00  
#>                                                           Max.   : 80995.00  
#>                                                                              
#>  InvoiceDate          UnitPrice           CustomerID       Country         
#>  Length:541909      Min.   :-11062.06   Min.   :12346    Length:541909     
#>  Class :character   1st Qu.:     1.25   1st Qu.:13953    Class :character  
#>  Mode  :character   Median :     2.08   Median :15152    Mode  :character  
#>                     Mean   :     4.61   Mean   :15288                      
#>                     3rd Qu.:     4.13   3rd Qu.:16791                      
#>                     Max.   : 38970.00   Max.   :18287                      
#>                                         NA's   :135080

Dari hasil summary() di atas, kita bisa mendapatkan informasi apabila suatu data bertipe numerik, kita dapat mengetahui beberapa nilai statistik seperti min, Q1, Q2, mean, Q3, dan max.

Perlu diperhatikan pada kolom quantity terdapat barang yang terjual negatif, oleh sebab itu kita perlu melakukan beberapa pra-proses data sebelum melakukan market basket analysis.

4.1 Data Cleansing

Seperti yang sudah kita ketahui bahwa R memiliki banyak packages dari berbagai kontributor, salah satu packages yang paling sering digunakan dalam melakukan pra-proses data yaitu packages dplyr.

Sekarang mari kita periksa berapa banyak data yang memiliki Quantity kurang dari 1

Fungsi filter() digunakan untuk memilih baris mana saja yang akan diambil berdasarkan kondisi yang diberikan, pada kasus ini adalah Quantity kurang dari 1. Operator %>% (dibaca piping) digunakan untuk menunjukkan proses apa yang harus dilakukan terhadap data yang dimiliki. Tulisan retail %>% filter(Quantity < 1) artinya kita punya data bernama retail yang kemudian kita hanya pilih baris dengan kondisi Quantity kurang dari 1.

Hasil di atas menunjukkan bahwa terdapat 10 ribu baris yang memiliki Quantity kurang dari 1, Quantity kurang dari 0 memiliki arti barang tersebut terjual dalam kondisi diskon. Misal kita tidak ingin menggunakan data tersebut karena kita tidak ingin melihat pengaruh diskon pada rules yang terbentuk nanti.

Selain melakukan filtering terhadap data, kita juga perlu melakukan seleksi terhadap kolom apa saja yang akan digunakan. Pada Market basket analysis ini kita hanya akan menggunakan kolom InvoiceNo dan Description. Adapun untuk memilih 2 kolom tersebut bisa menggunakan fungsi select()

Proses filter dan select di atas belum disimpan ke dalam objek, selain itu kedua proses tersebut dapat digabungkan menjadi satu proses dengan bantuan %>% (piping)

Hasil dari proses filtering dan selection disimpan pada objek retail_clean, objek inilah yang akan kita gunakan dalam proses analisis kedepannya.

4.2 Exploratory Data Analysis

Saat bekerja dengan data, proses eksplorasi data merupakan tahapan yang penting. Proses eksplorasi data bertujuan untuk mendapatkan informasi - informasi yang tidak terlihat apabila melihat data secara langsung. Dalam proses ini ada beberapa hal yang harus dicari tahu terlebih dahulu, seperti :

  • Barang apa yang paling sering dibeli oleh pelanggan?
  • Berapa banyak barang yang dibeli setiap transaksi?

Adapun untuk menjawab pertanyan di atas, Anda perlu melakukan aggregasi terhadap data terlebih dahulu, di bawah ini merupakan kode untuk mencari tahu Barang apa yang paling sering dibeli oleh pelanggan?

Fungsi count di atas bertujuan untuk menghitung frekuensi kemunculan dari variabel yang dipilih, pada kasus ini adalah Description. Parameter name merupakan nama dari kolom hasil perhitungan frekuensi, dan parameter sort bernilai TRUE atau FALSE yang bertujuan untuk mengurutkan data.

Dive deeper :

Lakukanlah aggregasi data untuk menjawab pertanyaan berapa banyak barang yang dibeli setiap transaksi ?

5 Market Basket Analysis menggunakan Algoritme Apriori

Market Basket Analysis atau sering juga disebut dengan Association rules merupakan kegiatan mencari aturan (rules) asosiasi yang menunjukkan hubungan antar item dalam sebuah transaksi. Sebagai contoh, ketika seseorang membeli roti, ia akan cenderung membeli selai juga, atau ketika seseorang membeli sikat gigi, ia juga akan membeli pasta giginya. Pola-pola data ini akan sangat bermanfaat dalam industri retail seperti penetapan diskon produk, promo, penjualan dalam bentuk paket, rekomendasi produk, serta penentuan lokasi item produk.

Adapun bidang industri lain yang juga dapat menggunakan Market Basket Analysis ini untuk menemukan pola di dalam data, misalnya dalam bidang kesehatan, association rules digunakan untuk mendapatkan hubungan dan interaksi antara faktor resiko seseorang dengan kecenderungan penyakit yang muncul. Di bidang genetika, association rules dapat digunakan untuk menemukan antara asosiasi faktor lingkungan dengan ekspresi gen yang muncul. Di bidang manufaktur, association rules dapat digunakan untuk mencari pola hubungan antara parameter-parameter proses produksi dengan potensi permasalahan kualitas produk. Market Basket Analysis juga dapat digunakan untuk mencari pola-pola desain produk yang diinginkan oleh pelanggan sehingga dapat menjadi dasar perancangan desain produk.

Terdapat beberapa algoritme atau metode untuk menemukan rules, salah satu yang populer adalah Apriori Algorithm. Association rules atau aturan asosiasi yang dihasilkan nantinya akan memiliki bentuk sebagai berikut.

\[A => B\]

Berdasarkan rumus di atas, A adalah antecedent atau pendahulu sedangkan B adalah consequent atau akibat. Cara membaca rumus di atas adalah jika seseorang membeli item A, maka ada kecenderungan dia juga akan membeli item B. Antecedent dapat berisis satu atau lebih item yang menjadi penanda bahwa ketika kita sudah tahu dia membeli item tersebut maka dia juga akan membeli item consequent. Bentuk hubungan ini tidak bersifat kausalitas atau sebab akibat, tetapi berbentuk co-occurence atau terjadi saling bersamaan.

5.1 Association Rules Metrics

Sebelum masuk ke dalam penjelasan tentang algoritme apriori, pertama kita harus mengetahui dahulu metrik atau tolak ukur yang digunakan dalam association rules, yang meliputi Support, Confidence, dan Lift.

Sebagai ilustrasi, kita akan menggunakan data buatan yang berisi 5 transaksi sebagai berikut:

5.1.1 Support

Support menunjukkan proporsi dari jumlah transaksi yang memiliki satu atau lebih item yang muncul secara bersamaan dibandingkan dengan jumlah transaksi secara keseluruhan. Rumus untuk menghitung Support dari suatu item adalah sebagai berikut:

\[Support(B) = \frac{Jumlah\ transaksi\ yang\ berisi\ item\ B }{Jumlah\ seluruh\ transaksi} = \frac{Freq(B)}{N}\]

Berdasarkan data transaksi sebelumnya, maka Support untuk item soft drink adalah sebagai berikut.

\[Support(soft\ drink) = \frac{2}{5} = 0.4\]

Artinya 40% dari total transaksi mengandung item soft drink.

Jika itemnya lebih dari satu, maka rumusnya menjadi seperti berikut:

\[Support(A,B) = \frac{Jumlah\ transaksi\ yang\ berisi\ item\ A\ \&\ B }{Jumlah\ seluruh\ transaksi} = \frac{Freq(A \cup B)}{N}\]

Berdasarkan data transaksi df_dummy sebelumnya, maka Support untuk item coffee dan mineral water adalah sebagai berikut.

\[Support(coffee, mineral\ water) = \frac{3}{5} = 0.6\]

Artinya 60% dari total transaksi mengandung item coffee dan mineral water.

5.1.2 Confidence

Jika Support hanya menunjukkan seberapa banyak proporsi sebuah item di seluruh transaksi, maka confidence menunjukkan seberapa besar kemungkinan seseorang akan membeli item B jika terdapat item A, atau setara dengan berapa banyak jumlah transaksi yang memiliki item A dan item B diantara transaksi-transaksi yang memiliki item A. Rumus untuk menghitung Confidence adalah sebagai berikut:

\[Confidence(A => B) = \frac{Freq(A\ \cap\ B)}{Freq(A)}\]

Berdasarkan data transaksi sebelumnya, maka Confidence untuk item coffee dan mineral water adalah sebagai berikut:

\[Confidence(mineral\ water => coffee) = \frac{3}{4} = 0.75\]

Confidence(mineral water => coffee) menunjukkan rules/aturan jika seseorang membeli mineral water, berapa kemungkinannya dia juga membeli coffee. Maka, kita perlu mencari ada berapa transaksi yang terdapat item mineral water dan coffee dan dibagi dengan seluruh transaksi yang di dalamnya terdapat mineral water. Dari total 5 transaksi yang ada, 4 di antaranya terdapat item mineral water dan dari 4 transaksi tersebut terdapat 3 transaksi yang memiliki coffee maupun mineral water, sehingga nilai Confidence(mineral water => coffee) adalah 3 dari 4 transaksi atau sama degan 75%. Maka, ketika seseorang membeli mineral water, kemungkinan seseorang membeli juga coffee adalah sekitar 75%.

Kelemahan dari Confidence adalah Confidence hanya mempertimbangkan seberapa banyak/populer item A saja (perhatikan bagian penyebut) dan tidak memperhatikan seberapa populer item B dalam seluruh transaksi. Perhatikan ilustrasi menggunakan diagram Venn berikut:

Berdasarkan gambar di atas, terdapat 80 transaksi yang berisi Milk dan 13 transaksi berisi Toothbrush. Selain itu, terdapat 10 transaksi di mana terdapat Milk dan Toothbrush. Jika kita memiliki rules bahwa Toothbrush => Milk, maka Confidence-nya adalah:

\[Confidence(Toothbrush => Milk) = \frac{10}{13} = 76.9\%\]

Ketika seseorang membeli Toothbrush maka ada kemungkinan 76.9% dia juga akan membeli Milk. Sekilas mungkin masuk akal, tetapi bila diperhatikan, Milk memiliki jumlah transaksi yang besar dan hanya sedikit dari transaksi tersebut yang berkaitan dengan Toothbrush. Karena item Milk sangat populer, maka wajar jika transaksi customer yang membeli Toothbrush juga akan cenderung membeli Milk, sehingga meningkatkan nilai Confidence-nya. Solusi untuk mengatasi hal ini, terdapat satu metrik lagi yang menggunakan informasi dari antecedent dan precedent, yakni Lift yang akan dibahas di sub-bab berikutnya.

5.1.3 Lift

Lift, sesuai namanya, menunjukkan seberapa baik sebuah antecedent “mengangkat” atau meningkatkan peluang seseorang membeli item consequent. Jika Confidence hanya mengukur seberapa besar peluang untuk membeli item B jika diketahui item A dibeli, maka Lift mengukur seberapa besar pembelian item A meningkatkan peluang pembelian item B. Rumus untuk menghitung Lift adalah sebagai berikut:

\[Lift(A,B) = \frac{Support(A,B)}{Support(A)\ Support(B)}\]

Berdasarkan data transaksi sebelumnya, maka Lift untuk item coffee dan mineral water adalah sebagai berikut.

Pertama, kita hitung terlebih dahulu nilai dari masing-masing Support yang dibutuhkan.

\[Support(mineral\ water, coffee) = \frac{3}{5} = 0.6\]

\[Support(mineral\ water) = \frac{4}{5} = 0.8\]

\[Support(coffee) = \frac{3}{5} = 0.6\]

Setelah mendapatkan semua nilai Support, kemudian masukkan nilai Support yang diperoleh ke dalam rumus untuk mendapatkan nilai Lift dari mineral water => coffee.

\[Lift(mineral\ water => coffee) = \frac{0.6}{0.6\ 0.8} = 1.25\]

Didapatkan nilai Lift(mineral water => coffee) = 1.25. Bagaimana cara menginterpretasikannya? Lift membandingkan peluang ketika keberadaan item satu menjadi sinyal kuat bahwa item lain juga akan dibeli dengan peluang bahwa keberadaan item satu dengan lainnya saling independen dan tidak berkaitan, sehingga:

  • Jika nilai Lift = 1, maka kedua item bersifat independen satu sama lain (tidak ada rules yang terbentuk).
  • Ketika nilai Lift > 1, maka dapat kita katakan bahwa keberadaan mineral water meningkatkan peluang bahwa seseorang juga membeli coffee.
  • Jika nilai Lift < 1, maka pembelian mineral water malah menurunkan peluang bahwa seseorang juga akan membeli coffee.

5.2 Algoritme Apriori

Algoritme yang umum digunakan untuk membuat association rules adalah Apriori Algorithm. Berikut merupakan cara kerja Apriori secara umum:

  1. Menentukan nilai minimum Support dan minimum Confidence
  2. Membuat itemsets dari daftar item yang ada
  3. Membandingkan support dari itemsets tersebut dengan minimum support, apabila nilai support dari suatu item dibawah minimum support maka itemsets tersebut dibuang atau tidak dibuat rules-nya.
  4. Membandingkan antara minimum Confidence dengan Confidence dari rules yang telah memenuhi minimum support. Hanya ambil rules yang memiliki Confidence lebih tinggi dari minimum Confidence.

5.3 Sparse matrix

Setelah mengetahui metrics yang digunakan dalam market basket analysis, serta cara kerja dari algoritme apriori, sekarang kita akan membuat rules dari data retail_clean. Perlu diingat bahwa struktur data input dalam algoritme Apriori harus berbentuk matrix. Setiap baris dalam matrix yang terbentuk merepresentasikan id transaksi dan kolom merepresentasikan barang yang dibeli.

Gambar di atas merupakan ilustrasi jika data df_dummy diubah menjadi matrix. Matrix di atas disebut sebagai sparse matrix.

Sparse Matrix merupakan matrix dengan elemen utamanya adalah nilai 0.

Adapun kekurangan dari sparse matrix adalah dimensi yang sangat besar, akibat dari dimensi yang besar ini adalah komputasi yang besar sehingga memperlambat waktu pembuatan rules. Oleh karena itu, untuk mengatasi permasalahan tersebut kita akan menggunakan data bertipe transactions. Data yang akan diguanakan adalah data retail_clean, data tersebut harus dikelompokkan berdasarkan InvoiceNo dengan menggunakan fungsi split()

#> $`536365`
#> [1] "white hanging heart t-light holder"  "white metal lantern"                
#> [3] "cream cupid hearts coat hanger"      "knitted union flag hot water bottle"
#> [5] "red woolly hottie white heart."      "set 7 babushka nesting boxes"       
#> [7] "glass star frosted t-light holder"  
#> 
#> $`536366`
#> [1] "hand warmer union jack"    "hand warmer red polka dot"
#> 
#> $`536367`
#>  [1] "assorted colour bird ornament"      "poppy's playhouse bedroom "        
#>  [3] "poppy's playhouse kitchen"          "feltcraft princess charlotte doll" 
#>  [5] "ivory knitted mug cosy "            "box of 6 assorted colour teaspoons"
#>  [7] "box of vintage jigsaw blocks "      "box of vintage alphabet blocks"    
#>  [9] "home building block word"           "love building block word"          
#> [11] "recipe box with metal heart"        "doormat new england"

Setelah mengubah data retail menjadi list, selanjutnya kita akan mengubah data list tersebut menjadi transaction dengan menggunakan fungsi as()

#>     items                                 transactionID
#> [1] {cream cupid hearts coat hanger,                   
#>      glass star frosted t-light holder,                
#>      knitted union flag hot water bottle,              
#>      red woolly hottie white heart.,                   
#>      set 7 babushka nesting boxes,                     
#>      white hanging heart t-light holder,               
#>      white metal lantern}                        536365
#> [2] {hand warmer red polka dot,                        
#>      hand warmer union jack}                     536366
#> [3] {assorted colour bird ornament,                    
#>      box of 6 assorted colour teaspoons,               
#>      box of vintage alphabet blocks,                   
#>      box of vintage jigsaw blocks ,                    
#>      doormat new england,                              
#>      feltcraft princess charlotte doll,                
#>      home building block word,                         
#>      ivory knitted mug cosy ,                          
#>      love building block word,                         
#>      poppy's playhouse bedroom ,                       
#>      poppy's playhouse kitchen,                        
#>      recipe box with metal heart}                536367

Pada dasarnya, data transaction diperoleh dari sparse matrix yang disederhanakan

#> [1]  4073 20728

6 Membuat rules

Rules dari algoritme apriori bisa dihasilkan dengan fungsi apriori() dari package arules. Fungsi tersebut menerima beberapa parameter seperti : * data : data transaksi yang ingin digunakan * parameter : * supp : batas bawah (threshold) dari nilai support * conf : batas bawah (threshold) dari nilai confidence

Pada kasus ini, kita batasi minimum support-nya adalah 1% (0.01), artinya item atau kombinasi item harus ada minimal 1% transaksi dari total keseluruhan transaksi. Kita juga batasi rules yang akan ditampilkan hanya rules dengan minimal confidence sebesar 0.7.

#> Apriori
#> 
#> Parameter specification:
#>  confidence minval smax arem  aval originalSupport maxtime support minlen
#>         0.7    0.1    1 none FALSE            TRUE       5    0.01      1
#>  maxlen target  ext
#>      10  rules TRUE
#> 
#> Algorithmic control:
#>  filter tree heap memopt load sort verbose
#>     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
#> 
#> Absolute minimum support count: 207 
#> 
#> set item appearances ...[0 item(s)] done [0.00s].
#> set transactions ...[4073 item(s), 20728 transaction(s)] done [0.27s].
#> sorting and recoding items ... [781 item(s)] done [0.01s].
#> creating transaction tree ... done [0.01s].
#> checking subsets of size 1 2 3 4 5 done [0.04s].
#> writing ... [218 rule(s)] done [0.00s].
#> creating S4 object  ... done [0.00s].

Selain itu, untuk melihat rangkuman dari aturan yang dihasilkan fungsi apriori dapat menggunakan fungsi summary()

#> set of 218 rules
#> 
#> rule length distribution (lhs + rhs):sizes
#>   2   3   4 
#>  54 132  32 
#> 
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   2.000   3.000   3.000   2.899   3.000   4.000 
#> 
#> summary of quality measures:
#>     support          confidence        coverage            lift       
#>  Min.   :0.01003   Min.   :0.7000   Min.   :0.01052   Min.   : 6.499  
#>  1st Qu.:0.01057   1st Qu.:0.7371   1st Qu.:0.01356   1st Qu.: 8.379  
#>  Median :0.01172   Median :0.7702   Median :0.01510   Median :16.316  
#>  Mean   :0.01296   Mean   :0.7845   Mean   :0.01666   Mean   :22.827  
#>  3rd Qu.:0.01354   3rd Qu.:0.8263   3rd Qu.:0.01821   3rd Qu.:25.542  
#>  Max.   :0.03705   Max.   :0.9587   Max.   :0.05143   Max.   :80.536  
#>      count      
#>  Min.   :208.0  
#>  1st Qu.:219.0  
#>  Median :243.0  
#>  Mean   :268.7  
#>  3rd Qu.:280.8  
#>  Max.   :768.0  
#> 
#> mining info:
#>                data ntransactions support confidence
#>  retail_transaction         20728    0.01        0.7

Berdasarkan keluaran hasil di atas diketahui bahwa rules yang dihasilkan sebanyak 218 rules, di mana rules terpanjang terdiri dari 4 item dengan jumlah rules sebanyak 32. Selain itu, kita bisa mengetahui nilai statistik dari support, confidence, coverage serta lift.

6.1 Hasil

6.1.1 Rules

Fungsi apriori di atas menghasilkan 218 rules, kita bisa menampilkan beberapa rules saja berdasarkan kriteria yang kita pilih. Bila ingin melihat 5 rules teratas berdasarkan nilai confidence tertinggi dapat menggunakan kode di bawah ini:

#>     lhs                                      rhs                                     support confidence   coverage     lift count
#> [1] {jam making set printed,                                                                                                     
#>      suki  shoulder bag}                  => {dotcom postage}                     0.01008298  0.9587156 0.01051717 28.06816   209
#> [2] {regency tea plate pink,                                                                                                     
#>      regency tea plate roses }            => {regency tea plate green }           0.01230220  0.9479554 0.01297761 51.57275   255
#> [3] {herb marker thyme}                   => {herb marker rosemary}               0.01066191  0.9324895 0.01143381 80.53601   221
#> [4] {wooden heart christmas scandinavian,                                                                                        
#>      wooden tree christmas scandinavian}  => {wooden star christmas scandinavian} 0.01114435  0.9277108 0.01201274 37.55779   231
#> [5] {herb marker rosemary}                => {herb marker thyme}                  0.01066191  0.9208333 0.01157854 80.53601   221

Nilai Confidence yang tinggi menunjukkan seberapa besar peluang membeli item lainnya jika kita telah membeli suatu item. Rules dengan Confidence tertinggi adalah {jam making set printed, suki shoulder bag} => {dotcom postage}, artinya ketika seorang pelanggan membeli 2 item tersebut, kemungkinan besar pelanggan juga akan membeli dotcom postage karena dari seluruh transaksi yang berisi 2 item pertama yang dibeli, 0.958 atau 95.8% pembelian juga terdapat item dotcom postage.

Kelemahan apabila melihat rules berdasarkan nilai Confidence adalah, Confidence hanya melihat dari transaksi antecedent dan tidak memperhatikan transaksi-transaksi lain dari consequent. Maka, kita perlu melihat seberapa baik antecedent meningkatkan peluang untuk pelanggan membeli item lainnya jika kita mengetahui dia telah memberi sekumpulan barang-barang tertentu dibandingkan ketika kita tidak tahu bahwa pelanggan membeli barang-barang tersebut. Oleh sebab itu, mari kita periksa 5 rules dengan Lift tertinggi.

#>      lhs                       rhs                    support    confidence
#> [1]  {herb marker thyme}    => {herb marker rosemary} 0.01066191 0.9324895 
#> [2]  {herb marker rosemary} => {herb marker thyme}    0.01066191 0.9208333 
#> [3]  {herb marker thyme}    => {herb marker parsley}  0.01027596 0.8987342 
#> [4]  {herb marker parsley}  => {herb marker thyme}    0.01027596 0.8949580 
#> [5]  {herb marker parsley}  => {herb marker rosemary} 0.01037244 0.9033613 
#> [6]  {herb marker rosemary} => {herb marker parsley}  0.01037244 0.8958333 
#> [7]  {herb marker mint}     => {herb marker parsley}  0.01022771 0.8833333 
#> [8]  {herb marker parsley}  => {herb marker mint}     0.01022771 0.8907563 
#> [9]  {herb marker basil}    => {herb marker rosemary} 0.01032420 0.8842975 
#> [10] {herb marker rosemary} => {herb marker basil}    0.01032420 0.8916667 
#>      coverage   lift     count
#> [1]  0.01143381 80.53601 221  
#> [2]  0.01157854 80.53601 221  
#> [3]  0.01143381 78.27295 213  
#> [4]  0.01148205 78.27295 213  
#> [5]  0.01148205 78.02031 215  
#> [6]  0.01157854 78.02031 215  
#> [7]  0.01157854 76.93165 212  
#> [8]  0.01148205 76.93165 212  
#> [9]  0.01167503 76.37383 214  
#> [10] 0.01157854 76.37383 214

Berdasarkan hasil di atas, rules {herb marker thyme} => {herb marker rosemary} memiliki Lift terbesar dengan nilai 80. Ketika nilai Lift lebih besar dari 1, maka pembelian herb marker thyme memang meningkatkan peluang pembeli untuk membeli herb marker rosemary. Jika kita bandingkan, rules dengan Confidence tertinggi, yakni{jam making set printed, suki shoulder bag} => {dotcom postage} ternyata hanya memiliki Lift sebesar 28. Meskipun pembelian kedua item tersebut meningkatkan peluang untuk membeli dotcom postage, tetapi efeknya tidak terlalu besar jika dibandingkan dengan rules lainnya.

6.1.2 Visualisasi Output

Manusia tidak dirancang untuk melihat deretan angka-angka dalam bentuk tabel dan terkadang sulit untuk membandingkan rules satu dan lainnya serta interaksi antar rules tidak terlihat ketika hanya membaca tabel saja. Oleh sebab itu, rules yang dihasilkan perlu dilakukan visualisasi untuk mempermudah pemahaman terhadap rules yang terbentuk.

Untuk memvisualisasikan rules yang sudah terbentuk kita dapat menggunakan fungsi plotly_arules dari packages arulesViz

Berdasarkan 218 rules yang dihasilkan, hanya terdapat beberapa rules yang memiliki Confidence tinggi dan Lift yang tinggi pula, sementara sebagian besar rules hanya memiliki Lift tinggi atau Confidence tinggi saja. Sedangkan, dari semua rules yang dihasilkan, tidak terdapat rules yang memilki Lift kurang dari 1, sehingga dapat disimpulkan bahwa semua rules yang dihasilkan dapat meningkatkan peluang untuk pembelian item tertentu.

Dari rules yang dihasilkan dapat dilihat juga hubungan antar rules dengan menggunakan graph atau network, dengan tiap lingkaran atau titik adalah rules dan panah sebagai hubungan antara rules dengan item barangnya.

Pada grafik yang dihasilkan di atas, terdapat beberapa cluster atau kelompok rules yang saling berinteraksi satu sama lain. Salah satu yang terbesar adalah cluster yang berisi charlotte bag yang saling terhubung. Cluster lainnya yang berisi banyak rules yang saling terkoneksi adalah clusterherb marker.

Kita ambil contoh cluster charlotte bag, yang hanya terdiri dari 5 item/produk, yakni woodland charlotte bag, strawberry charlotte bag, red retrospot charlotte bag, charlotte bag pink polkadot, charlotte bag suki design. Berdasarkan interaksi 5 item tersebut, dihasilkan puluhan rules/aturan yang berbeda. Apabila diperhatikan ke 5 item tersebut saling terhubung, maka hal ini menunjukkan adanya hubungan keterkaitan antara rules satu dengan lainnya. Oleh karena kita meyakini adanya hubungan keterkaitan yang kuat antara item satu dengan lainnya di dalam cluster tersebut, maka kita bisa membuat sebuah promo dalam bentuk Bundle Package; yakni paket lengkap yang berisi 5 item tersebut.

7 Dive Deeper

8 Other Implementation